#include <stdio.h>
#include "/etc/alternatives/mpi/mpi.h"

int main(int argc, char** argv){

	int i = 1000;
	int total = 0;

	int iterator;
	int my_rank; // Identificador deste processo
	int proc_n; // Numero de processos disparados pelo usuario na linha de comando (np)
	int message; // Buffer para as mensagens
	int saco[15]; // saco de trabalho
	MPI_Status status; // estrutura que guarda o estado de retorno

	for (iterator = 0; i < 15; saco[i++] = 32 + i);

	MPI_Init(&argc, &argv); // funcao que inicializa o MPI, todo o codigo paralelo estah abaixo

	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); // pega pega o numero do processo atual (rank)
	MPI_Comm_size(MPI_COMM_WORLD, &proc_n); // pega informacao do numero de processos (quantidade total)

	if (my_rank == 0) {
		// qual o meu papel: sou o mestre ou um dos escravos?
		// papel do mestre

		printf("\nMestre[%d]: ", my_rank);
		for (i = 0; i < 15; printf("%d ", saco[i++]));

		// mando o trabalho para os escravos fazerem
		for (i = 1; i < proc_n; i++) {
			message = saco[i - 1];
			MPI_Send(&message, 1, MPI_INT, i, 1, MPI_COMM_WORLD); // envio trabalho saco[i-1] para escravo com id = i
		}

		// recebo o resultado
		for (i = 1; i < proc_n; i++) {
			MPI_Recv(&message, 1, MPI_INT, i, 1, MPI_COMM_WORLD, &status); // recebo trabalho do escravo com id = i
			saco[i - 1] = message; // e coloco no saco[i-1]
		}

		// mostro o saco
		printf("\nMestre[%d]: ", my_rank);
		for (i = 0; i < 15; printf("%d ", saco[i++]));
		printf("\n\n");

	} else {
		// papel do escravo

		// recebo mensagem

		MPI_Recv(&message, 1, MPI_INT, 0, 1, MPI_COMM_WORLD, &status);

		// executo

		printf("\nEscravo[%d]: recebi %d", my_rank, message);
		message = burn();

		// retorno resultado para o mestre

		MPI_Send(&message, 1, MPI_INT, 0, 1, MPI_COMM_WORLD);
	}

	MPI_Finalize();

}

int burn(){
	int i = 1000;
		int total = 0;

	while( i < 1000000 ){
			int flag = 0;

			if(i%10 == 4){
				if((i/10)%10 == 4){
					if(flag==0)
						total++;printf("achei: %d\n", i);
					flag = 1;
				}
			}

			if(i%10 == 5){
				if((i/10)%10 == 5){
					if(flag==0){
						total++;printf("achei: %d\n", i);
					}
					flag = 1;
				}
			}

			int j = 1;
			while( j <= sizeof( i )){
				int mult = 10;
				if(i/mult%10 == 4){
					if(i/(mult*10)%10 == 4){
						if(flag==0){
							total++;printf("achei: %d\n", i);
						}
						flag = 1;

					}
				}

				if(i/mult%10 == 5){
					if(i/(mult*10)%10 == 5){
						if(flag==0){
							total++;printf("achei: %d\n", i);
						}
						flag = 1;

					}
				}

				mult = mult*10;
				j++;
			}
			i++;

		}
		printf("Total %d\n", total);
		return total;
}
